---
id: guangzhou-migration-map
title: 广州人口迁徙
---

### 示例

```jsx live
function render(props) {
  const container = useRef(null);

  const dataUrl = useBaseUrl('/json/toursim.json');

  const initChat = (map, option) => {
    const chart = new EChartsLayer(option, {
      stopEvent: false,
      hideOnMoving: false,
      hideOnZooming: false,
      forcedPrecomposeRerender: true,
    });

    chart.appendTo(map);
  }

  const init = async () => {
    const map = new ol.Map({
      target: container.current,
      view: new ol.View({
        projection: 'EPSG:4326',
        zoom: 9,
        rotation: 0,
        center: [113.466408,23.111777],
      }),
      layers: [
        new TileLayer({
          source: new XYZ({
            url: 'https://{a-c}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png',
          }),
        }),
      ],
    });

    const GZ_DATA_GEO_CoordMap = {
      '天河区': [113.368672,23.130389],
      '黄埔区': [113.466408,23.111777],
      '海珠区': [113.323254,23.089173],
      '越秀区': [113.272949,23.135441],
      '荔湾区': [113.250815,23.131453],
      '白云区': [113.278986,23.164151],
      '南沙区': [113.530511,22.808027],
      '花都区': [113.225806,23.412711],
      '增城区': [113.817106,23.267509],
      '从化区': [113.593464,23.555101],
      '番禺区': [113.391669,22.943615]
    }
    const ZCData = [
      [{name:'增城区'}, {name:'番禺区',value:95}],
      [{name:'增城区'}, {name:'从化区',value:90}],
      [{name:'增城区'}, {name:'天河区',value:80}],
      [{name:'增城区'}, {name:'花都区',value:70}],
      [{name:'增城区'}, {name:'南沙区',value:60}],
      [{name:'增城区'}, {name:'白云区',value:50}],
      [{name:'增城区'}, {name:'荔湾区',value:40}],
      [{name:'增城区'}, {name:'越秀区',value:30}],
      [{name:'增城区'}, {name:'海珠区',value:20}],
      [{name:'增城区'}, {name:'增城区',value:10}],
      [{name:'增城区'}, {name:'黄埔区',value:10}]
    ];
    const NSData = [
      [{name:'南沙区'},{name:'黄埔区',value:95}],
      [{name:'南沙区'},{name:'海珠区',value:90}],
      [{name:'南沙区'},{name:'越秀区',value:80}],
      [{name:'南沙区'},{name:'荔湾区',value:70}],
      [{name:'南沙区'},{name:'天河区',value:60}],
      [{name:'南沙区'},{name:'白云区',value:50}],
      [{name:'南沙区'},{name:'花都区',value:40}],
      [{name:'南沙区'},{name:'增城区',value:30}],
      [{name:'南沙区'},{name:'从化区',value:20}],
      [{name:'南沙区'},{name:'番禺区',value:10}]
    ];
    const HZData = [
      [{name:'海珠区'},{name:'黄埔区',value:95}],
      [{name:'海珠区'},{name:'白云区',value:90}],
      [{name:'海珠区'},{name:'越秀区',value:80}],
      [{name:'海珠区'},{name:'荔湾区',value:70}],
      [{name:'海珠区'},{name:'天河区',value:60}],
      [{name:'海珠区'},{name:'南沙区',value:50}],
      [{name:'海珠区'},{name:'花都区',value:40}],
      [{name:'海珠区'},{name:'增城区',value:30}],
      [{name:'海珠区'},{name:'从化区',value:20}],
      [{name:'海珠区'},{name:'番禺区',value:10}]
    ];
    const CHData = [
      [{name:'从化区'},{name:'黄埔区',value:95}],
      [{name:'从化区'},{name:'白云区',value:90}],
      [{name:'从化区'},{name:'越秀区',value:80}],
      [{name:'从化区'},{name:'荔湾区',value:70}],
      [{name:'从化区'},{name:'天河区',value:60}],
      [{name:'从化区'},{name:'南沙区',value:50}],
      [{name:'从化区'},{name:'花都区',value:40}],
      [{name:'从化区'},{name:'增城区',value:30}],
      [{name:'从化区'},{name:'海珠区',value:20}],
      [{name:'从化区'},{name:'番禺区',value:10}]
    ];
    const HDData = [
      [{name:'花都区'},{name:'黄埔区',value:95}],
      [{name:'花都区'},{name:'白云区',value:90}],
      [{name:'花都区'},{name:'越秀区',value:80}],
      [{name:'花都区'},{name:'荔湾区',value:70}],
      [{name:'花都区'},{name:'天河区',value:60}],
      [{name:'花都区'},{name:'南沙区',value:50}],
      [{name:'花都区'},{name:'从化区',value:40}],
      [{name:'花都区'},{name:'增城区',value:30}],
      [{name:'花都区'},{name:'海珠区',value:20}],
      [{name:'花都区'},{name:'番禺区',value:10}]
    ];
    const convertData_gz = function (data) {
      const res = [];
      for (let i = 0; i < data.length; i++) {
        const dataItem = data[i];
        const fromCoord = GZ_DATA_GEO_CoordMap[dataItem[0].name];
        const toCoord = GZ_DATA_GEO_CoordMap[dataItem[1].name];
        if (fromCoord && toCoord) {
          res.push({
            fromName: dataItem[0].name,
            fromValue : dataItem[1].value,
            toName: dataItem[1].name,
            coords: [fromCoord, toCoord]
          });
        }
      }
      return res;
    };
    const color = ['#a6c84c', '#ffa022', '#46bee9','#ff3399','#D15FEE'];
    const series = [];
    [['增城区', ZCData], ['南沙区', NSData], ['海珠区', HZData],['从化区', CHData],['花都区', HDData]].forEach(function (item, i) {
      series.push(
        {
          name: item[0],
          type: 'lines',
          zlevel: 1,
          effect: {
            show : true,
            period : 6,
            trailLength : 0.7,
            color : '#fff',
            symbolSize : 3,
            shadowBlur : 4.4
          },
          lineStyle: {
            color: color[i],
            width: 0,
            curveness: 0.2
          },
          data: convertData_gz(item[1])
        },
        {
          name: item[0],
          type: 'lines',
          zlevel: 2,
          symbol: ['none', 'arrow'],
          symbolSize: 10,
          effect: {
            show: true,
            period: 6,
            trailLength: 0,
            //symbol: planePath_gz,
            symbolSize: 6
          },
          lineStyle: {
            color: color[i],
            width: 1,
            opacity: 0.5,
            curveness: 0.2
          },
          data: convertData_gz(item[1])
        },
        {
          name: item[0],
          type: 'effectScatter',
          zlevel: 2,
          rippleEffect: {
            brushType: 'stroke'
          },
          label: {
            show: (i == 0 ? true : false),
            position: 'right',
            formatter: '{b}'
          },
          symbolSize: function (val) {
            return val[2] / 10;
          },
          itemStyle: {
            color: color[i]
          },
          data: item[1].map(function (dataItem) {
            return {
              name: dataItem[1].name,
              value: GZ_DATA_GEO_CoordMap[dataItem[1].name].concat([dataItem[1].value])
            };
          })
        });
    });

    const option = {
      tooltip: {
        trigger: 'item',
        formatter: function (params) {
          if (params.data.fromName) {
            return params.data.fromName + " > " + params.data.toName + " <br/>流量数 : " + params.data.fromValue;
          }else{
            return params.name + "<br/>流向广州人数：" + params.value[2];
          }
        }
      },
      legend: {
        orient: 'vertical',
        top:'5%',
        left: 'right',
        data:['增城区', '南沙区', '海珠区','从化区','花都区'],
        textStyle: {
          color: '#fff'
        },
        selectedMode: 'mutipla',
        bottom:'50%'
      },
      visualMap: {
        min: 0,
        max: 100,
        calculable: true,
        inRange: {
          color: ['#50a3ba', '#eac736', '#d94e5d']
        },
        textStyle: {
          color: '#fff'
        },
        bottom:"10%"
      },
      series : series
    };

    initChat(map, option);

    function resize(target) {}

    return {
      resize,
    }
  }

  useEffect(() => {
    const { resize } = init();

    return () => {
    };
  }, []);

  return (
    <div className="live-wrap">
      <div ref={container} className="map-content" />
    </div>
  );
}
```
